package com.yzk.train.common.exception;

import cn.hutool.core.util.StrUtil;
import com.yzk.train.common.response.Result;
import io.seata.core.context.RootContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 统一异常处理、数据预处理等
 */
@ControllerAdvice
public class ExceptionController {

    private static final Logger LOG = LoggerFactory.getLogger(ExceptionController.class);

    /**
     * 所以异常统一处理
     * @param e
     */
    @ExceptionHandler({Exception.class})
    @ResponseBody
    public Result ExceptionHandler(Exception e) throws Exception {
        // 如果是在一次全局事务里出异常了，就不包装返回值，将异常抛给调用方，让调用方回滚事务
        if (StrUtil.isNotBlank(RootContext.getXID())) {
            throw e;
        }
        LOG.error("系统异常: {}", e.getMessage());
        return Result.fail("系统异常，请联系管理员！");
    }

    /**
     * 业务异常统一处理
     * @param e
     */
    @ExceptionHandler({BusinessException.class})
    @ResponseBody
    public Result BusinessExceptionHandler(BusinessException e) {
        LOG.warn("业务异常: {}", e.getE().getDesc());
        return Result.fail(e.getE().getDesc());
    }

    /**
     * 业务异常统一处理
     * @param e
     */
    @ExceptionHandler({BindException.class})
    @ResponseBody
    public Result BindExceptionHandler(BindException e) {
        String defaultMessage = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        LOG.warn("校验异常: {}", defaultMessage);
        return Result.fail(defaultMessage);
    }

}
